home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / font / ScriptRun.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  2.5 KB  |  211 lines

  1. package sun.font;
  2.  
  3. public final class ScriptRun {
  4.    private char[] text;
  5.    private int textStart;
  6.    private int textLimit;
  7.    private int scriptStart;
  8.    private int scriptLimit;
  9.    private int scriptCode;
  10.    private int[] stack;
  11.    private int parenSP;
  12.    static final int SURROGATE_START = 65536;
  13.    static final int LEAD_START = 55296;
  14.    static final int LEAD_LIMIT = 56320;
  15.    static final int TAIL_START = 56320;
  16.    static final int TAIL_LIMIT = 57344;
  17.    static final int LEAD_SURROGATE_SHIFT = 10;
  18.    static final int SURROGATE_OFFSET = -56613888;
  19.    static final int DONE = -1;
  20.    private static int[] pairedChars = new int[]{40, 41, 60, 62, 91, 93, 123, 125, 171, 187, 8216, 8217, 8220, 8221, 8249, 8250, 12296, 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12308, 12309, 12310, 12311, 12312, 12313, 12314, 12315};
  21.    private static final int pairedCharPower;
  22.    private static final int pairedCharExtra;
  23.  
  24.    public ScriptRun() {
  25.    }
  26.  
  27.    public ScriptRun(char[] var1, int var2, int var3) {
  28.       this.init(var1, var2, var3);
  29.    }
  30.  
  31.    public void init(char[] var1, int var2, int var3) {
  32.       if (var1 != null && var2 >= 0 && var3 >= 0 && var3 <= var1.length - var2) {
  33.          this.text = var1;
  34.          this.textStart = var2;
  35.          this.textLimit = var2 + var3;
  36.          this.scriptStart = this.textStart;
  37.          this.scriptLimit = this.textStart;
  38.          this.scriptCode = -1;
  39.          this.parenSP = 0;
  40.       } else {
  41.          throw new IllegalArgumentException();
  42.       }
  43.    }
  44.  
  45.    public final int getScriptStart() {
  46.       return this.scriptStart;
  47.    }
  48.  
  49.    public final int getScriptLimit() {
  50.       return this.scriptLimit;
  51.    }
  52.  
  53.    public final int getScriptCode() {
  54.       return this.scriptCode;
  55.    }
  56.  
  57.    public final boolean next() {
  58.       int var1 = this.parenSP;
  59.       if (this.scriptLimit >= this.textLimit) {
  60.          return false;
  61.       } else {
  62.          this.scriptCode = 0;
  63.          this.scriptStart = this.scriptLimit;
  64.  
  65.          int var2;
  66.          while((var2 = this.nextCodePoint()) != -1) {
  67.             int var3 = ScriptRunData.getScript(var2);
  68.             int var4 = var3 == 0 ? getPairIndex(var2) : -1;
  69.             if (var4 >= 0) {
  70.                if ((var4 & 1) == 0) {
  71.                   if (this.stack == null) {
  72.                      this.stack = new int[32];
  73.                   } else if (this.parenSP == this.stack.length) {
  74.                      int[] var5 = new int[this.stack.length + 32];
  75.                      System.arraycopy(this.stack, 0, var5, 0, this.stack.length);
  76.                      this.stack = var5;
  77.                   }
  78.  
  79.                   this.stack[this.parenSP++] = var4;
  80.                   this.stack[this.parenSP++] = this.scriptCode;
  81.                } else if (this.parenSP > 0) {
  82.                   int var6 = var4 & -2;
  83.  
  84.                   while((this.parenSP -= 2) >= 0 && this.stack[this.parenSP] != var6) {
  85.                   }
  86.  
  87.                   if (this.parenSP >= 0) {
  88.                      var3 = this.stack[this.parenSP + 1];
  89.                   } else {
  90.                      this.parenSP = 0;
  91.                   }
  92.  
  93.                   if (this.parenSP < var1) {
  94.                      var1 = this.parenSP;
  95.                   }
  96.                }
  97.             }
  98.  
  99.             if (!sameScript(this.scriptCode, var3)) {
  100.                this.pushback(var2);
  101.                break;
  102.             }
  103.  
  104.             if (this.scriptCode <= 1 && var3 > 1) {
  105.                for(this.scriptCode = var3; var1 < this.parenSP; var1 += 2) {
  106.                   this.stack[var1 + 1] = this.scriptCode;
  107.                }
  108.             }
  109.  
  110.             if (var4 > 0 && (var4 & 1) != 0 && this.parenSP > 0) {
  111.                this.parenSP -= 2;
  112.             }
  113.          }
  114.  
  115.          return true;
  116.       }
  117.    }
  118.  
  119.    private final int nextCodePoint() {
  120.       if (this.scriptLimit >= this.textLimit) {
  121.          return -1;
  122.       } else {
  123.          int var1 = this.text[this.scriptLimit++];
  124.          if (var1 >= 55296 && var1 < 56320 && this.scriptLimit < this.textLimit) {
  125.             char var2 = this.text[this.scriptLimit];
  126.             if (var2 >= '\udc00' && var2 < '\ue000') {
  127.                ++this.scriptLimit;
  128.                var1 = (var1 << 10) + var2 + -56613888;
  129.             }
  130.          }
  131.  
  132.          return var1;
  133.       }
  134.    }
  135.  
  136.    private final void pushback(int var1) {
  137.       if (var1 >= 0) {
  138.          if (var1 >= 65536) {
  139.             this.scriptLimit -= 2;
  140.          } else {
  141.             --this.scriptLimit;
  142.          }
  143.       }
  144.  
  145.    }
  146.  
  147.    private static boolean sameScript(int var0, int var1) {
  148.       return var0 == var1 || var0 <= 1 || var1 <= 1;
  149.    }
  150.  
  151.    private static final byte highBit(int var0) {
  152.       if (var0 <= 0) {
  153.          return -32;
  154.       } else {
  155.          byte var1 = 0;
  156.          if (var0 >= 65536) {
  157.             var0 >>= 16;
  158.             var1 = (byte)(var1 + 16);
  159.          }
  160.  
  161.          if (var0 >= 256) {
  162.             var0 >>= 8;
  163.             var1 = (byte)(var1 + 8);
  164.          }
  165.  
  166.          if (var0 >= 16) {
  167.             var0 >>= 4;
  168.             var1 = (byte)(var1 + 4);
  169.          }
  170.  
  171.          if (var0 >= 4) {
  172.             var0 >>= 2;
  173.             var1 = (byte)(var1 + 2);
  174.          }
  175.  
  176.          if (var0 >= 2) {
  177.             var0 >>= 1;
  178.             ++var1;
  179.          }
  180.  
  181.          return var1;
  182.       }
  183.    }
  184.  
  185.    private static int getPairIndex(int var0) {
  186.       int var1 = pairedCharPower;
  187.       int var2 = 0;
  188.       if (var0 >= pairedChars[pairedCharExtra]) {
  189.          var2 = pairedCharExtra;
  190.       }
  191.  
  192.       while(var1 > 1) {
  193.          var1 >>= 1;
  194.          if (var0 >= pairedChars[var2 + var1]) {
  195.             var2 += var1;
  196.          }
  197.       }
  198.  
  199.       if (pairedChars[var2] != var0) {
  200.          var2 = -1;
  201.       }
  202.  
  203.       return var2;
  204.    }
  205.  
  206.    static {
  207.       pairedCharPower = 1 << highBit(pairedChars.length);
  208.       pairedCharExtra = pairedChars.length - pairedCharPower;
  209.    }
  210. }
  211.